# 判断当前系统环境，windows与linux的执行脚本的终端不一样，windows是cmd，linux是sh，他们删除创建文件的方式不一样
ifeq ($(OS), Windows_NT)
    IS_WINDOWS = 1
else
    IS_WINDOWS = 0
endif

PROJDIR   = .
BUILDDIR  = $(PROJDIR)/build_makefile
OBJDIR    = $(BUILDDIR)/obj
LSTDIR    = $(BUILDDIR)/lst
ROOTDIR   = $(PROJDIR)/..
SRCPP_PATH = $(PROJDIR)/src
SRC_PATH   = $(PROJDIR)/src
ifeq ($(IS_WINDOWS),1)
	LIB_PATH =  $(PROJDIR)/lib/windows
else
	LIB_PATH =  $(PROJDIR)/lib/linux
# 在linux中加载库没起作用，怀疑是必须是在运行目标的终端上，因为在一个bash上执行完后，在另一个bash上也不能运行，另外把so放到与目标一个路径下也是不行的
# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib/linux
endif

# 生成最终的文件名
EXE = test1

# cpp源文件
# SRCCPP = $(PROJDIR)/src/main.cpp\
# 		 $(PROJDIR)/src/fileMgr.cpp
SRCCPP =  $(wildcard $(SRCPP_PATH)/*.cpp) 
# c源文件
SRCC   = $(wildcard $(SRCPP_PATH)/*.c) 
# asm源文件
SRCA   = 
# 要链接的动态库，不需要加前缀lib以及后缀dll或so
SHARELIB = -lpublic \
		   -lhv
# 要链接的静态库
STATICLIB = $(LIB_PATH)/libpublic.a

# 头文件路径
INCLUDES =  -I$(PROJDIR)/include
# 动态库静态库链接路径
LIBINCLUDES =  -L$(LIB_PATH)
	

# 可以通过命令行指定工程名，通过工程名来包含不同项目的makefile文件，make PROJECT_NAME=PROJECT_1
ifeq ($(PROJECT_NAME),PROJECT_1)
	-include $(ROOTDIR)/project1/Mc.mk
endif
ifeq ($(PROJECT_NAME),PROJECT_2)
	-include $(ROOTDIR)/project2/Mc.mk
endif

OBJSA    = $(addprefix $(OBJDIR)/, $(notdir $(SRCA:.s=.o)))
OBJSC    = $(addprefix $(OBJDIR)/, $(notdir $(SRCC:.c=.o)))
OBJSCPP  = $(addprefix $(OBJDIR)/, $(notdir $(SRCCPP:.cpp=.o)))
OBJS	 = $(OBJSA) $(OBJSC) $(OBJSCPP)
OBJS_DEPDS = $(patsubst %.o, %.d, $(OBJS))

# 编译选项 -Wall：警告信息都打印出来 -e：不打印警告信息 -O2：优化等级 -MMD：生成依赖文件.d
CFLAGS = -Wall -O2 -MMD
CPPFLAGS = -Wall -O2 -MMD
# CFLAGS += -D$(PROJECT_NAME)	
# CPPFLAGS += -D$(PROJECT_NAME)
#LFLAGS = -r -nostdlib -Wl,-X -Wl,-EL

# 当makefile与源文件不在同一个路径时，需要包含VPATH搜索源文件路径
SRC	  = $(SRCC) $(SRCCPP)
SRCPATHS  = $(sort $(dir $(SRCA)) $(dir $(SRC)))
VPATH     = $(SRCPATHS)

# 指定编译器
CC = g++



$(EXE) : $(OBJS)
ifeq ($(IS_WINDOWS),1)
	@copy $(subst /,\\,$(LIB_PATH))\*.dll  $(subst /,\\,$(BUILDDIR))\*.dll
else
endif	
	$(CC) $(LFLAGS) $(LIBINCLUDES) -o $(BUILDDIR)/$(EXE) $(OBJS) $(SHARELIB) 
	
$(OBJSA) : $(OBJDIR)/%.o:%.s
ifeq ($(IS_WINDOWS),1)
	@ if not exist  $(subst /,\\,$(OBJDIR)) ( mkdir  $(subst /,\\,$(OBJDIR)) ) 
else
	@ - if [ -d $(OBJDIR) ] ; then echo ; else mkdir -p $(OBJDIR) ; fi
endif
	@echo Compiling $<
	@$(AS) $(CFLAGS) $(INCLUDES) -o $@ -c $<
	
$(OBJSC) : $(OBJDIR)/%.o : %.c
ifeq ($(IS_WINDOWS),1)
	@ if not exist  $(subst /,\\,$(OBJDIR)) ( mkdir  $(subst /,\\,$(OBJDIR)) ) 
else
	@ - if [ -d $(OBJDIR) ] ; then echo ; else mkdir -p $(OBJDIR) ; fi
endif
	@echo Compiling $<
	gcc $(CFLAGS) $(INCLUDES) -MT $@ -o $@ -c $<

$(OBJSCPP) : $(OBJDIR)/%.o : %.cpp
ifeq ($(IS_WINDOWS),1)
	@ if not exist  $(subst /,\\,$(OBJDIR)) ( mkdir  $(subst /,\\,$(OBJDIR)) ) 
else
	@ - if [ -d $(OBJDIR) ] ; then echo ; else mkdir -p $(OBJDIR) ; fi
endif
	@echo Compiling $<
	$(CC) $(CPPFLAGS) $(INCLUDES) -MT $@ -o $@ -c $<

# 把.d文件include进来，当只有头文件改变时，也会更新编译 放在$(EXE) : $(OBJS)前面会提示make: 'build_makefile/obj/parm.o' is up to date.
-include $(OBJS:%.o=%.d)

clean :
	@echo $(OBJS:%.o=%.d)
ifeq ($(IS_WINDOWS),1)
	@-del $(subst /,\\,$(OBJDIR))\* /Q
	@-del $(subst /,\\,$(BUILDDIR))\* /Q
else
	@-rm -rf $(OBJDIR)/* 
	@-rm -rf $(BUILDDIR)/*
endif
	
	